package com.hmall.order.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmall.common.clients.ItemSearchClients;
import com.hmall.common.clients.UserClients;
import com.hmall.common.dto.Address;
import com.hmall.common.dto.Item;
import com.hmall.order.mapper.OrderMapper;
import com.hmall.order.pojo.Order;
import com.hmall.order.pojo.OrderDetail;
import com.hmall.order.pojo.OrderLogistics;
import com.hmall.order.pojo.OrderParams;
import com.hmall.order.service.IOrderService;
import com.hmall.order.utils.ThreadLocalUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

@Service
public class OrderService extends ServiceImpl<OrderMapper, Order> implements IOrderService {
    @Autowired
    private ItemSearchClients itemSearchClients;
    @Autowired
    private OrderDetailService orderDetailService;
    @Autowired
    private UserClients userClients;
    @Autowired
    private OrderLogisticsService orderLogisticsService;

    @Transactional
    @Override
    public Long insertOrder(OrderParams orderParams) {
//                - 1）根据雪花算法生成订单id
//                - 2）商品微服务提供FeignClient，实现根据id查询商品的接口
//                - 3）根据itemId查询商品信息
                Item item = itemSearchClients.getById(orderParams.getItemId());
//                - 4）基于商品价格、购买数量计算商品总价：totalFee
                long totalFee = item.getPrice() * orderParams.getNum();
//                - 5）封装Order对象，初识status为未支付
                Order order = new Order();
                order.setTotalFee(totalFee);
                order.setPaymentType(orderParams.getPaymentType());
                order.setUserId(ThreadLocalUtils.getUser());
                order.setStatus(1);
                order.setCreateTime(new Date());
                order.setUpdateTime(new Date());
//                - 6）将Order写入数据库tb_order表中
                this.save(order);
//                - 7）将商品信息、orderId信息封装为OrderDetail对象，写入tb_order_detail表
                OrderDetail orderDetail = new OrderDetail();
                orderDetail.setOrderId(order.getId());
                orderDetail.setItemId(item.getId());
                orderDetail.setNum(orderParams.getNum());
                orderDetail.setName(item.getName());
                orderDetail.setPrice(item.getPrice());
                orderDetail.setSpec(item.getSpec());
                orderDetailService.save(orderDetail);
//                - 8）将user-service的根据id查询地址接口封装为FeignClient
//                - 9）根据addressId查询user-service服务，获取地址信息
                Long addressId = orderParams.getAddressId();
                Address address = userClients.findAddressById(addressId);
//                - 10）将地址封装为OrderLogistics对象，写入tb_order_logistics表
                OrderLogistics orderLogistics = new OrderLogistics();
                BeanUtils.copyProperties(address, orderLogistics);
                orderLogistics.setMobile(address.getMobile());
                orderLogistics.setOrderId(order.getId());
                orderLogisticsService.save(orderLogistics);
//                - 11）在item-service提供减库存接口，并编写FeignClient
//                - 12）调用item-service的减库存接口
        try {
            itemSearchClients.deductItem(orderParams.getItemId(),orderParams.getNum());
        } catch (Exception e) {
            throw new RuntimeException("库存不足");
        }
        return order.getId();
    }
}
